/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package com.architexa.org.eclipse.gef.commands;

/**
 * An Abstract implementation of {@link Command}.
 * @author hudsonr
 * @since 2.0
 */
public abstract class Command {

private String label;

private String debugLabel;

/**
 * Constructs a Command with no label.
 */
public Command () { }

/**
 * Constructs a Command with the specified label.
 * @param label the Command's label
 */
public Command (String label) {
	setLabel(label);
}

/**
 * @return <code>true</code> if the command can be executed
 */
public boolean canExecute() {
	return true;
}

/**
 * @return <code>true</code> if the command can be undone. This method should only be
 * called after <code>execute()</code> or <code>redo()</code> has been called.
 */
public boolean canUndo() {
	return true;
}

/**
 * Returns a Command that represents the chaining of a specified Command to this
 * Command. The Command being chained will <code>execute()</code> after this command has
 * executed, and it will <code>undo()</code> before this Command is undone.
 * @param command <code>null</code> or the Command being chained
 * @return a Command representing the union
 */
public Command chain(Command command) {
	if (command == null)
		return this;
	class ChainedCompoundCommand
		extends CompoundCommand
	{
		public Command chain(Command c) {
			add(c);
			return this;
		}
	}
	CompoundCommand result = new ChainedCompoundCommand();
	result.setDebugLabel("Chained Commands"); //$NON-NLS-1$
	result.add(this);
	result.add(command);
	return result;
}

/**
 * This is called to indicate that the <code>Command</code> will not be used again. The
 * Command may be in any state (executed, undone or redone) when dispose is called. The
 * Command should not be referenced in any way after it has been disposed.
 */
public void dispose() { }

/**
 * executes the Command. This method should not be called if the Command is not
 * executable.
 */
public void execute() { }

/**
 * @return an untranslated String used for debug purposes only
 */
public String getDebugLabel() {
	return debugLabel + ' ' + getLabel();
}

/**
 * @return a String used to describe this command to the User
 */
public String getLabel() {
	return label;
}

/**
 * Re-executes the Command. This method should only be called after <code>undo()</code>
 * has been called.
 */
public void redo() {
	execute();
}

/**
 * Sets the debug label for this command
 * @param label a description used for debugging only
 */
public void setDebugLabel(String label) {
	debugLabel = label;
}

/**
 * Sets the label used to describe this command to the User.
 * @param label the label
 */
public void setLabel(String label) {
	this.label = label;
}

/**
 * Undoes the changes performed during <code>execute()</code>. This method should only be
 * called after <code>execute</code> has been called, and only when <code>canUndo()</code>
 * returns <code>true</code>.
 * @see #canUndo()
 */
public void undo() { }

}
